VaR método Delta-Normal o varianzas-covarianzas
-----------------------------------------------
Importar datos.
~~~~~~~~~~~~~~~
.. code:: r
datos = read.csv("Cuatro acciones 2020.csv", sep = ";", dec = ",", header = T)
Matriz de precios.
~~~~~~~~~~~~~~~~~~
Crear una matriz con los valores de los precios de las acciones:
``[,-1]`` elimina la primera columna de la matriz ``datos`` que
corresponde a las fechas. Quedan solo los precios.
.. code:: r
precios = datos[,-1]
.. code:: r
head(precios)
.. raw:: html
A data.frame: 6 × 4
| ECO | PFAVAL | ISA | NUTRESA |
| <int> | <int> | <int> | <int> |
1 | 2775 | 1165 | 13080 | 25720 |
2 | 2645 | 1155 | 13080 | 25700 |
3 | 2615 | 1165 | 13320 | 25980 |
4 | 2690 | 1165 | 13420 | 25920 |
5 | 2730 | 1175 | 13660 | 25920 |
6 | 2740 | 1190 | 13560 | 25840 |
.. code:: r
precios = ts(precios)
.. code:: r
dim(precios)
.. raw:: html
- 500
- 4
Se cargaron cuatro acciones y 500 precios por acción.
Nombres de las acciones.
~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
nombres = colnames(precios)
nombres
.. raw:: html
- 'ECO'
- 'PFAVAL'
- 'ISA'
- 'NUTRESA'
Número de acciones.
~~~~~~~~~~~~~~~~~~~
.. code:: r
acciones = ncol(precios)
acciones
.. raw:: html
4
Matriz de rendimientos.
~~~~~~~~~~~~~~~~~~~~~~~
.. math:: Rendimiento_t=log\frac{Precio_t}{Precio_{t-1}}
.. math:: log\frac{Precio_t}{Precio_{t-1}}=log(Precio_t)-log(Precio_{t-1})
.. code:: r
rendimientos = diff(log(precios))
.. code:: r
dim(rendimientos)
.. raw:: html
- 499
- 4
Hay 499 rendimientos por acción.
:math:`S_0:`\ Precio actual de cada acción.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
s = tail(precios,1)
s = as.numeric(s)
s
.. raw:: html
- 2220
- 955
- 18000
- 22500
El precio de ECO es de 2.220 COP, de PFAVAL 955 COP, ISA de 18.000 COP y
NUTRESA de 22.500 COP.
Número de acciones del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
numero_acciones = c(180000,5000,12000,9000)
numero_acciones
.. raw:: html
- 180000
- 5000
- 12000
- 9000
Valor de mercado de cada acción.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
valor_mercado_acciones = numero_acciones*s
valor_mercado_acciones
.. raw:: html
- 399600000
- 4775000
- 2.16e+08
- 202500000
**ECO:** $ 399.600.000.
**PFAVAL:** $ 4.775.000.
**ISA:** $ 216.000.000.
**NUTRESA:** $ 202.500.000.
Valor de mercado del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
valor_portafolio = sum(valor_mercado_acciones)
valor_portafolio
.. raw:: html
822875000
El portafolio de inversión está valorado en $ 822.875.000.
Proporciones de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
proporciones = valor_mercado_acciones/valor_portafolio
proporciones
.. raw:: html
- 0.485614461491721
- 0.00580282545951694
- 0.262494303509038
- 0.246088409539724
**ECO:** 48,56%.
**PFAVAL:** 0,580%.
**ISA:** 26,25%.
**NUTRESA:** 24,61%.
.. math:: \sum_{i=1}^nw_i=1
.. code:: r
sum(proporciones)
.. raw:: html
1
:math:`\mu:` Rendimiento esperado de cada acción.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
rendimientos_esperados = apply(rendimientos,2,mean)
rendimientos_esperados
.. raw:: html
- ECO
- -0.000447181465559539
- PFAVAL
- -0.000398326704447035
- ISA
- 0.000639854532799824
- NUTRESA
- -0.000268043266851791
**ECO:** -0,0447% diario.
**PFAVAL:** -0,0398% diario.
**ISA:** 0,0640% diario.
**NUTRESA:** -0,0268% diario.
:math:`\sigma:`\ Volatilidad de cada acción.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
volatilidades = apply(rendimientos,2,sd)
volatilidades
.. raw:: html
- ECO
- 0.0319324424190137
- PFAVAL
- 0.0285577211893029
- ISA
- 0.0237292026947701
- NUTRESA
- 0.0140104740592151
**ECO:** 3,193% diaria.
**PFAVAL:** 2,856% diaria.
**ISA:** 2,373% diaria.
**NUTRESA:** 1,401% diaria.
Matriz varianzas-covarianzas.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
covarianzas = cov(rendimientos)
covarianzas
.. raw:: html
A matrix: 4 × 4 of type dbl
| ECO | PFAVAL | ISA | NUTRESA |
ECO | 0.0010196809 | 0.0005939468 | 0.0001160327 | 0.0001493216 |
PFAVAL | 0.0005939468 | 0.0008155434 | 0.0001564360 | 0.0001322689 |
ISA | 0.0001160327 | 0.0001564360 | 0.0005630751 | 0.0001519996 |
NUTRESA | 0.0001493216 | 0.0001322689 | 0.0001519996 | 0.0001962934 |
Coeficientes de correlación.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
correlacion = cor(rendimientos)
correlacion
.. raw:: html
A matrix: 4 × 4 of type dbl
| ECO | PFAVAL | ISA | NUTRESA |
ECO | 1.0000000 | 0.6513161 | 0.1531317 | 0.3337626 |
PFAVAL | 0.6513161 | 1.0000000 | 0.2308501 | 0.3305836 |
ISA | 0.1531317 | 0.2308501 | 1.0000000 | 0.4572004 |
NUTRESA | 0.3337626 | 0.3305836 | 0.4572004 | 1.0000000 |
Rendimientos del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. math:: R_P=\sum_{i=1}^nw_iR_i
---------------------------------
.. code:: r
rendimientos_portafolio = vector()
for(i in 1:nrow(rendimientos)){
rendimientos_portafolio[i] = sum(rendimientos[i,]*proporciones)
}
Rendimiento esperado del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
rendimiento_esperado_portafolio = mean(rendimientos_portafolio)
rendimiento_esperado_portafolio
.. raw:: html
-0.000117473378221543
Rendimientos esperado del portafolio de inversión diario de -0,012%.
Volatilidad del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
volatilidad_portafolio = sd(rendimientos_portafolio)
volatilidad_portafolio
.. raw:: html
0.0195008972788864
Volatilidad del portafolio de inversión diaria de 1,950%.
Volatilidad del portafolio a partir de la matriz de varianzas-covarianzas.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
volatilidad_portafolio = sqrt(sum(t(proporciones)%*%covarianzas*proporciones))
volatilidad_portafolio
.. raw:: html
0.0195008972788864
Volatilidad del portafolio de inversión diaria de 1,950%.
VaR (sin promedios)
~~~~~~~~~~~~~~~~~~~
Nivel de confianza, ``NC``, del 99% y horizonte de tiempo, ``t``, de 10
días. Estos días representan dos semanas.
La frecuencia de los datos es diaria, por tanto ``t = 10``.
.. code:: r
NC = 0.99
t = 10
.. math:: \alpha=0,01
----------------------
.. figure:: VaR1.jpg
:alt: 1
1
En la distribución normal con :math:`\mu=0`, se cumple que:
.. math:: |Z_{\alpha=0,01}|=Z_{NC=0,99}
----------------------------------------
VaR individuales (sin promedios) [%].
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. math:: VaR=Z_{\alpha}\sigma\sqrt{(t)}
=========================================
.. code:: r
VaR_individuales_sin_promedios_porcentaje = volatilidades*qnorm(NC)*sqrt(t)
VaR_individuales_sin_promedios_porcentaje
.. raw:: html
- ECO
- 0.234912861922595
- PFAVAL
- 0.210086529759846
- ISA
- 0.17456525382633
- NUTRESA
- 0.103068863789222
- Con un nivel de confianza del 99%, el VaR diario de ECO es de 23,49%.
- Con una probabilidad del 99%, se espera perder 21,01% o menos cada
día con la acción de PFAVAL.
- Con una probabilidad del 1%, se espera perder más de 17,46% cada día
con la acción de ISA.
- De cada 100 días, se espera que en un (1) día se pierda más de 10,31%
con la acción de NUTRESA y 99 días perder 10,31% o menos.
VaR individuales (sin promedios) [$].
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. math:: VaR=Z_{\alpha}\sigma V_0\sqrt{(t)}
=============================================
.. code:: r
VaR_individuales_sin_promedios = valor_mercado_acciones*volatilidades*qnorm(NC)*sqrt(t)
VaR_individuales_sin_promedios
.. raw:: html
- ECO
- 93871179.624269
- PFAVAL
- 1003163.17960326
- ISA
- 37706094.8264872
- NUTRESA
- 20871444.9173174
Conclusión:
~~~~~~~~~~~
- Con un nivel de confianza del 99%, el VaR diario de ECO es de
93.871.179,62 COP.
- Con una probabilidad del 99%, se espera perder 1.003.163,18 COP o
menos cada día con la acción de PFAVAL.
- Con una probabilidad del 1%, se espera perder más de 37.706.094,83
COP cada día con la acción de ISA.
- De cada 100 días, se espera que en un (1) día se pierda más de
20.871.444,92 COP con la acción de NUTRESA y 99 días perder
20.871.444,92 COP o menos.
El vector ``VaR_individuales_sin_promedios`` está vertical.
VaR portafolio de inversión (sin promedios) [$].
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. math:: VaR_P=\sqrt{\sum_{i=1}^nVaR_i^2+2\sum_{i
.dl-inline {width: auto; margin:0; padding: 0}
.dl-inline>dt, .dl-inline>dd {float: none; width: auto; display: inline-block}
.dl-inline>dt::after {content: ":\0020"; padding-right: .5ex}
.dl-inline>dt:not(:first-of-type) {padding-left: .5ex}
- ECO
- 0.23938467657819
- PFAVAL
- 0.214069796804316
- ISA
- 0.168166708498332
- NUTRESA
- 0.10574929645774
VaR individuales (con promedios) [$].
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. math:: VaR = |\mu + Z_{\alpha} \sigma V_0|
----------------------------------------------
.. code:: r
VaR_individuales_con_promedios = valor_mercado_acciones*abs(rendimientos_esperados*t+qnorm(1-NC, sd = volatilidades*sqrt(t)))
VaR_individuales_con_promedios
.. raw:: html
- ECO
- 95658116.7606449
- PFAVAL
- 1022183.27974061
- ISA
- 36324009.0356396
- NUTRESA
- 21414232.5326923
VaR portafolio de inversión (con promedios) [$].
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Se transpone el vector ``VaR_individuales_con_promedios`` al principio
de la ecuación porque está vertical y debe ser primero horizontal. Al
final de la ecuación debe estar vertical.
Para transponer se usa la función ``t``.
.. code:: r
VaR_portafolio_con_promedios = sqrt(sum(t(VaR_individuales_con_promedios)%*%correlacion*VaR_individuales_con_promedios))
VaR_portafolio_con_promedios
.. raw:: html
119295160.239381
VaR portafolio de inversión (con promedios) [%].
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_portafolio_con_promedios_porcentaje = VaR_portafolio_con_promedios/valor_portafolio
VaR_portafolio_con_promedios_porcentaje
.. raw:: html
0.144973611106646
Sumatoria de los VaR.
~~~~~~~~~~~~~~~~~~~~~
.. code:: r
suma_VaR_individuales_con_promedios = sum(VaR_individuales_con_promedios)
suma_VaR_individuales_con_promedios
.. raw:: html
154418541.608717
Beneficio por diversificación (BD)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
BD_con_promedios = suma_VaR_individuales_con_promedios - VaR_portafolio_con_promedios
BD_con_promedios
.. raw:: html
35123381.3693362
Otra forma de calcular el VaR (sin promedios)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Esta forma es a partir de las proporciones de inversión,
``proporciones``, y la matriz varianzas-covarianzas, ``covarianzas``.
El vector ``proporciones`` está vertical, se debe transponer al
principio de la ecuación.
Volatilidad del portafolio a partir de la matriz de varianzas-covarianzas
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
vol_portafolio = sqrt(sum(t(proporciones)%*%covarianzas*proporciones))
vol_portafolio
.. raw:: html
0.0195008972788864
VaR portafolio de inversión (sin promedios) [$].
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
VaR_portafolio_sin_promedios = valor_portafolio*vol_portafolio*qnorm(NC)*sqrt(t)
VaR_portafolio_sin_promedios
.. raw:: html
118049219.741064
Este valor es igual al calculado anteriormente a partir de los VaR
individuales (sin promedio).
Gráficos
~~~~~~~~
Precios de las acciones.
~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
plot(precios, col = "darkblue", lwd = 2, main = "Precios")
.. image:: output_123_0.png
:width: 420px
:height: 420px
Rendimientos de las acciones.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
plot(rendimientos, col = "darkblue", lwd = 2, main = "Rendimientos")
.. image:: output_125_0.png
:width: 420px
:height: 420px
Histograma, distribución normal y VaR (sin promedios) de las acciones.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
layout(matrix(c(1:4), nrow = 2, byrow = T))
# layout.show(4) correr esta línea en RStudio.
for(i in 1:acciones){
hist(rendimientos[,i], breaks = 60, col= "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = nombres[i], freq = F, xlim = c(-0.5, 0.5))
curve(dnorm(x, mean = 0, sd = volatilidades[i]*sqrt(t)), add = T, lwd = 3)
abline(v = - VaR_individuales_sin_promedios_porcentaje[i], col = "darkred", lwd = 2)
}
.. image:: output_127_0.png
:width: 420px
:height: 420px
Histograma, distribución normal y VaR (sin promedios) del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
hist(rendimientos_portafolio, breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = "Portafolio de inversión", freq=F, xlim = c(-0.3, 0.3))
curve(dnorm(x, mean = 0, sd = volatilidad_portafolio*sqrt(t)), add = T, lwd = 3)
abline(v = -VaR_portafolio_con_promedios_porcentaje, col = "darkgreen", lwd = 4)
.. image:: output_129_0.png
:width: 420px
:height: 420px
Comparación VaR (sin promedios).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
hist(rendimientos_portafolio, breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = "", freq=F, xlim = c(-0.3,0.1))
for(i in 1:acciones){
abline(v = - VaR_individuales_sin_promedios_porcentaje[i], col = i, lwd = 2)
}
abline(v = -VaR_portafolio_sin_promedios_porcentaje, col = "darkgreen", lwd = 4)
legend("topleft", nombres, lty = rep(1, times = acciones), lwd = rep(2, times = acciones), col = seq(1, acciones), bty = "n")
.. image:: output_131_0.png
:width: 420px
:height: 420px
Histograma, distribución normal y VaR (con promedios) de las acciones.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
layout(matrix(c(1:4), nrow = 2, byrow = T))
# layout.show(4) correr esta línea en RStudio.
for(i in 1:acciones){
hist(rendimientos[,i], breaks = 60, col= "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = nombres[i], freq = F, xlim = c(-0.5, 0.5))
curve(dnorm(x, mean = rendimientos_esperados[i]*t, sd = volatilidades[i]*sqrt(t)), add = T, lwd = 3)
abline(v = - VaR_individuales_con_promedios_porcentaje[i], col = "darkred", lwd = 2)
}
.. image:: output_133_0.png
:width: 420px
:height: 420px
Histograma, distribución normal y VaR (con promedios) del portafolio de inversión.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
hist(rendimientos_portafolio, breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = "Portafolio de inversión", freq=F, xlim = c(-0.5, 0.5))
curve(dnorm(x, mean = rendimiento_esperado_portafolio*t, sd = volatilidad_portafolio*sqrt(t)), add = T, lwd = 3)
abline(v = -VaR_portafolio_con_promedios_porcentaje, col = "darkgreen", lwd = 4)
.. image:: output_135_0.png
:width: 420px
:height: 420px
Comparación VaR (con promedios).
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. code:: r
hist(rendimientos_portafolio, breaks = 60, col = "gray", xlab = "Rendimientos", ylab = "Frecuencia", main = "", freq=F, xlim = c(-0.3,0.1))
for(i in 1:acciones){
abline(v = - VaR_individuales_con_promedios_porcentaje[i], col = i, lwd = 2)
}
abline(v = -VaR_portafolio_con_promedios_porcentaje, col = "darkgreen", lwd = 4)
legend("topleft", nombres, lty = rep(1, times = acciones), lwd = rep(2, times = acciones), col = seq(1, acciones), bty = "n")
.. image:: output_137_0.png
:width: 420px
:height: 420px